package top.lixunda.ecommerce.server.user.api.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import top.lixunda.commerce.common.core.entity.MessageObject;
import top.lixunda.common.validate.XumValid;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageDTO;
import top.lixunda.ecommerce.server.user.api.entity.db.RoleDO;
import top.lixunda.ecommerce.server.user.api.entity.dto.RoleChangeDTO;
import top.lixunda.ecommerce.server.user.api.entity.dto.RoleInsertAdminDTO;
import top.lixunda.ecommerce.server.user.api.entity.dto.RoleInsertStoreDTO;
import top.lixunda.ecommerce.server.user.api.entity.dto.RoleQueryDTO;

import java.util.List;

/**
 * 角色管理接口
 *
 * @author lixunda
 * @version time:2020/4/26 14:57
 */
@Api("角色管理接口")
@RequestMapping("/role")
public interface IRoleController {

    /**
     * 根据角色编号查询店铺可用角色信息
     *
     * @param id 角色编号
     * @return 角色数据
     */
    @ApiOperation("根据角色编号查询店铺可用角色信息")
    @GetMapping("queryStoreRoleById")
    MessageObject<RoleDO> queryStoreRoleById(@RequestParam("id") Integer id);

    /**
     * 根据角色编号查询官方后台系统可用角色信息
     *
     * @param id 角色编号
     * @return 角色数据
     */
    @ApiOperation("根据角色编号查询官方后台系统可用角色信息")
    @GetMapping("queryAdminRoleById")
    MessageObject<RoleDO> queryAdminRoleById(@RequestParam("id") Integer id);

    /**
     * 根据角色编号查询店铺可用角色信息
     *
     * @param ids 角色编号列表
     * @return 角色数据列表
     */
    @ApiOperation("根据角色编号查询店铺可用角色信息")
    @PostMapping("queryStoreRolesByIds")
    MessageObject<List<RoleDO>> queryStoreRolesByIds(@RequestBody List<Integer> ids);

    /**
     * 根据角色编号查询官方后台系统可用角色信息
     *
     * @param ids 角色编号列表
     * @return 角色数据列表
     */
    @ApiOperation("根据角色编号查询官方后台系统可用角色信息")
    @PostMapping("queryAdminRolesByIds")
    MessageObject<List<RoleDO>> queryAdminRolesByIds(@RequestBody List<Integer> ids);

    /**
     * 查询当前登陆店铺可用所有角色信息
     *
     * @return 角色信息列表
     */
    @ApiOperation("查询当前登陆店铺可用所有角色信息")
    @GetMapping("queryCurrentStoreAll")
    MessageObject<List<RoleDO>> queryCurrentStoreAll();

    /**
     * 查询后台管理员可用所有角色信息
     *
     * @return 角色信息列表
     */
    @ApiOperation("查询后台管理员可用所有角色信息")
    @GetMapping("queryCurrentAdminAll")
    MessageObject<List<RoleDO>> queryCurrentAdminAll();

    /**
     * 条件分页查询当前登陆店铺可用所有角色信息
     *
     * @param pageDTO 条件分页数据
     * @return 角色信息分页数据
     */
    @ApiOperation("条件分页查询当前登陆店铺可用所有角色信息")
    @PostMapping("queryStoreRolePageWrapper")
    MessageObject<Page<RoleDO>> queryStoreRolePageWrapper(
            @RequestBody @XumValid PageDTO<RoleDO, RoleQueryDTO> pageDTO);

    /**
     * 条件分页查询后台管理员可用所有角色信息
     *
     * @param pageDTO 条件分页数据
     * @return 角色信息分页数据
     */
    @ApiOperation("条件分页查询后台管理员可用所有角色信息")
    @PostMapping("queryAdminRolePageWrapper")
    MessageObject<Page<RoleDO>> queryAdminRolePageWrapper(
            @RequestBody @XumValid PageDTO<RoleDO, RoleQueryDTO> pageDTO);

    /**
     * 添加一条店铺角色信息数据
     *
     * @param list 添加数据DTO列表
     * @return 添加成功数据
     */
    @ApiOperation("添加一条店铺角色信息数据")
    @PostMapping("insertStoreRole")
    MessageObject<List<RoleDO>> insertStoreRole(@RequestBody List<RoleInsertStoreDTO> list);

    /**
     * 添加一条管理系统角色信息数据
     *
     * @param list 添加数据DTO列表
     * @return 添加成功数据
     */
    @ApiOperation("添加一条管理系统角色信息数据")
    @PostMapping("insertAdminRole")
    MessageObject<List<RoleDO>> insertAdminRole(@RequestBody List<RoleInsertAdminDTO> list);

    /**
     * 修改一条店铺角色信息数据
     *
     * @param list 修改数据DTO列表
     * @return 修改成功数据
     */
    @ApiOperation("修改一条店铺角色信息数据")
    @PostMapping("changeStoreRole")
    MessageObject<List<RoleDO>> changeStoreRole(@RequestBody List<RoleChangeDTO> list);

    /**
     * 修改一条管理系统角色信息数据
     *
     * @param list 修改数据DTO列表
     * @return 修改成功数据
     */
    @ApiOperation("修改一条管理系统角色信息数据")
    @PostMapping("changeAdminRole")
    MessageObject<List<RoleDO>> changeAdminRole(@RequestBody List<RoleChangeDTO> list);

    /**
     * 根据角色编号移除店铺角色信息
     *
     * @param roleIds 角色编号列表
     * @return 是否移除成功
     */
    @ApiOperation("根据角色编号移除店铺角色信息")
    @PostMapping("removeStoreRole")
    MessageObject<Boolean> removeStoreRole(@RequestBody List<Integer> roleIds);

    /**
     * 根据角色编号移除管理系统角色信息
     *
     * @param roleIds 角色编号列表
     * @return 是否移除成功
     */
    @ApiOperation("根据角色编号移除管理系统角色信息")
    @PostMapping("removeAdminRole")
    MessageObject<Boolean> removeAdminRole(@RequestBody List<Integer> roleIds);

    /**
     * 修改一条店铺角色信息数据，固化数据修改
     *
     * @param list 修改数据DTO列表
     * @return 修改成功数据
     */
    @ApiOperation("修改一条店铺角色信息数据，固化数据修改")
    @PostMapping("changeStoreSolidifyRole")
    MessageObject<List<RoleDO>> changeStoreSolidifyRole(@RequestBody List<RoleChangeDTO> list);

    /**
     * 修改一条管理系统角色信息数据，固化数据修改
     *
     * @param list 修改数据DTO列表
     * @return 修改成功数据
     */
    @ApiOperation("修改一条管理系统角色信息数据，固化数据修改")
    @PostMapping("changeAdminSolidifyRole")
    MessageObject<List<RoleDO>> changeAdminSolidifyRole(@RequestBody List<RoleChangeDTO> list);

    /**
     * 根据角色编号移除店铺角色信息，固化数据移除
     *
     * @param roleIds 角色编号列表
     * @return 是否移除成功
     */
    @ApiOperation("根据角色编号移除店铺角色信息，固化数据移除")
    @PostMapping("removeStoreSolidifyRole")
    MessageObject<Boolean> removeStoreSolidifyRole(@RequestBody List<Integer> roleIds);

    /**
     * 根据角色编号移除管理系统角色信息，固化数据移除
     *
     * @param roleIds 角色编号列表
     * @return 是否移除成功
     */
    @ApiOperation("根据角色编号移除管理系统角色信息，固化数据移除")
    @PostMapping("removeAdminSolidifyRole")
    MessageObject<Boolean> removeAdminSolidifyRole(@RequestBody List<Integer> roleIds);

}
